package com.nfit.shopweb.service.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import com.nfit.shopmodel.vo.common.AuthConst;
import com.nfit.shopmodel.vo.system.ValidateCodeVo;
import com.nfit.shopweb.service.ValidateCodeService;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * ClassName:ValidateCodeServiceImpl
 * Package:com.nfit.shopweb.service.impl
 * Description
 *验证码业务
 * @Author L
 * @Create 2024/11/16 18:46
 */
@Schema(name = "验证码",description = "验证码业务实现")
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 生成图片验证码
     * 实现思路：第一步：使用hutool工具生成验证码图片,
     * 第二步：生成uuid作为验证码的key(目的为了存储在redis中)
     * 第三步：ValidateCodeVo封装数据返回给前端
     *  validateCodeVo.setCodeKey(codeKey); 表示key(也就是验证码存储在redis中的key)
     *  validateCodeVo.setCodeValue(AuthConst.VALIDATE_VALUE + imageBase64); 表示返回给前端的验证码是经过加密的验证码
     */
    @Override
    public ValidateCodeVo getValidateCode() {

        //第一步： 使用hutool工具包中的工具类生成图片验证码
        //参数：宽  高  验证码位数 干扰线数量
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150,48,4,20);
        //4位验证码的值（如: k 3 3 0）
        String codeValue = captcha.getCode();
        //返回图片验证码,也是经过Base64位编码加密的值
        String imageBase64 = captcha.getImageBase64();

        //第二步：生成uuid作为图片验证码的key
        String codeKey = UUID.randomUUID().toString().replaceAll("-","");
        //设置redis过期时间
        redisTemplate.opsForValue().set(AuthConst.VALIDATE_CODE+codeKey,codeValue,5, TimeUnit.MINUTES);

        //封装数据,返回给前端
        ValidateCodeVo validateCodeVo = new ValidateCodeVo();
        validateCodeVo.setCodeKey(codeKey);
        //表示是一个图片类型的验证码
        validateCodeVo.setCodeValue(AuthConst.VALIDATE_VALUE + imageBase64);

        return validateCodeVo;
    }
}
